<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JSX</title>
</head>
<body>
    <!-- 准备好DOM容器 -->
    <div id="test"></div>

    <!-- 必须按照顺序引入JS -->
    <!-- 引入React核心库 -->
    <script src="../js/react.development.js"></script>
    <!-- 引入react-dom库，用于操作DOM -->
    <script src="../js/react-dom.development.js"></script>
    <!-- 引入babel，用于将JSX翻译为JS -->
    <script src="../js/babel.min.js"></script>

    <!-- type必须为text/babel，代表里面的内容为JSX -->
    <script type="text/babel">
        /**
         * JSX 全名 JavaScript XML，是React定义的一种类似于XML的JS扩展语法。
         * 其本质是React.createElement(components, props, ...children)方法的语法糖
         * 其标签名任意。既可以是HTML标签，也可以是自定义标签。
         */

        const pageTitle = '前端JS框架列表'
        const jsFrameworks = ['Angular', 'React', 'Vue']
        // 1. 创建虚拟DOM
        // React规定每个标签都要有唯一的Key，使用index作为li的key可能会出现重复
        const VDOM = (
            <div>
                <h1>{pageTitle}</h1>
                <ul>
                    {
                        jsFrameworks.map((item, index) => <li key={index}>{item}</li>)
                    }
                </ul>
            </div>
        )

        // 2. 渲染虚拟DOM到页面
        ReactDOM.render(VDOM, document.getElementById('test'))

        /**
         * JSX语法规则
         *   1. 定义虚拟DOM时，不要写引号。
         *   2. 标签中使用JS表达式时，使用{}。
         *   3. CSS样式的类名指定不要用class，要用className。
         *   4. 内联样式要用style={{key1:value1, key2:value2,...}}的形式去写。
         *   5. 虚拟DOM只能有一个根标签。
         *   6. 标签必须闭合。
         *   7. 标签首字母
         *     （1）若小写字母开头，则将该标签转为HTML中的同名元素，若HTML中无同名元素，则在控制台中显示相应警告。
         *     （2）若大写字母开头，React就去渲染对应的组件，若组件没有定义，则会报错。
         */
    </script>
</body>
</html>